package com.kinyx.framework.reflect;

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

import org.junit.Assert;
import org.junit.Test;

public class KAnnotationUtils_Tester_get {

	@Retention(RetentionPolicy.SOURCE)
	public @interface A1 {}
	@Retention(RetentionPolicy.CLASS)
	public @interface A2 {}
	@Retention(RetentionPolicy.RUNTIME)
	public @interface A {}
	@Retention(RetentionPolicy.RUNTIME)
	@Inherited
	public @interface AX {}

	@A1
	@A2
	@A
	@AX
	static class Bean {
		@A1
		@A2
		@A
		@AX
		private String str1;
		@SuppressWarnings("unused")
		private String str2;
	}

	static class Bean1 extends Bean {}

	@Test
	public void test1() {
		Assert.assertNull(KAnnotationUtils.get(Bean.class, A1.class.getName()));// SOURCE类型仅保留在源码中。
		Assert.assertNull(KAnnotationUtils.get(Bean.class, A2.class.getName()));// CLASS类型会保留在.class文件中，但并不在运行时生效。
		Assert.assertNotNull(KAnnotationUtils.get(Bean.class, A.class.getName()));
		Assert.assertNotNull(KAnnotationUtils.get(Bean.class, AX.class.getName()));

		Assert.assertNull(KAnnotationUtils.get(Bean1.class, A.class.getName()));// 不可继承类型的注解，在子类上取不到。
		Assert.assertNotNull(KAnnotationUtils.get(Bean1.class, AX.class.getName()));
	}

	@Test
	public void test2() throws NoSuchFieldException, SecurityException {
		Assert.assertNull(KAnnotationUtils.get(Bean.class.getDeclaredField("str1"), A1.class.getName()));// SOURCE类型仅保留在源码中。
		Assert.assertNull(KAnnotationUtils.get(Bean.class.getDeclaredField("str1"), A2.class.getName()));// CLASS类型会保留在.class文件中，但并不在运行时生效。
		Assert.assertNotNull(KAnnotationUtils.get(Bean.class.getDeclaredField("str1"), A.class.getName()));
		Assert.assertNotNull(KAnnotationUtils.get(Bean.class.getDeclaredField("str1"), AX.class.getName()));

		Assert.assertNull(KAnnotationUtils.get(Bean.class.getDeclaredField("str2"), A.class.getName()));
		Assert.assertNull(KAnnotationUtils.get(Bean.class.getDeclaredField("str2"), AX.class.getName()));
	}

}
